/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dca.sistemascontrole.malhadecontrole;

import br.ufrn.dca.controle.QuanserClientException;
import dca.sistemascontrole.exception.LogManager;
import dca.sistemascontrole.handler.HandlerMainFrame;
import dca.sistemascontrole.util.ControleConstantes;
import dca.sistemascontrole.view.components.VariaveisObservaveis;
import java.util.Calendar;

/**
 *
 * @author Rafael
 */
public class Clock extends Thread {

    private boolean isRunning;
    private long lastSleepEventTime;
    private HandlerMainFrame handlerMainFrame;
    private StringBuilder stringBuilder = new StringBuilder();
    private static final int TEMPO_DE_AMOSTRAGEM_MS = 100;

    public Clock(HandlerMainFrame handlerMainFrame) {
        this.handlerMainFrame = handlerMainFrame;
    }

    @Override
    public void run() {
        isRunning = true;
        lastSleepEventTime = System.currentTimeMillis();

        while (isRunning) {
            handlerMainFrame.runControlador();
            sleep();
        }
    }

    private void sleep() {
        try {
            long timeInMillis = Calendar.getInstance().getTimeInMillis();
            int tempoDormindo = (int) (timeInMillis - lastSleepEventTime);
            int diferenca = TEMPO_DE_AMOSTRAGEM_MS - tempoDormindo;
            lastSleepEventTime = timeInMillis;

            int proxTempoDormindo;
            if (tempoDormindo == TEMPO_DE_AMOSTRAGEM_MS) {
                proxTempoDormindo = TEMPO_DE_AMOSTRAGEM_MS;
            } else {
                proxTempoDormindo = TEMPO_DE_AMOSTRAGEM_MS + diferenca;
                lastSleepEventTime += diferenca;
            }
            if (proxTempoDormindo < 1) {
                proxTempoDormindo = TEMPO_DE_AMOSTRAGEM_MS;
            }
            LogManager.logTempo(stringBuilder.append("Tempo dormido gerenciador de Comunicação dormiu: ").append(tempoDormindo).toString());
            stringBuilder.delete(0, stringBuilder.length());
            Thread.sleep(proxTempoDormindo);

        } catch (InterruptedException ex) {
            LogManager.logMessage("Thread de comunicação interrompida");
        }
    }
}
